#ifndef QQMUSIC_H
#define QQMUSIC_H

#include <QWidget>
#include<volumetool.h>
#include<QMediaPlayer>
#include<QMediaPlaylist>
#include<QPropertyAnimation>
#include<QSqlDatabase>


#include"musiclist.h"
#include"commonpage.h"
#include"lrcpage.h"

QT_BEGIN_NAMESPACE
namespace Ui { class QQMusic; }
QT_END_NAMESPACE

class QQMusic : public QWidget
{
    Q_OBJECT

public:
    QQMusic(QWidget *parent = nullptr);
    ~QQMusic();

    //窗口初始化
    void initui();

    //播放器相关的初始化
    void initPlay();

    //初始化数据库
    void initSQLite();

    void initMusicList();

    void quitQQMusic();

    //准备好推荐页面图片路径和文本
    QJsonArray randomPiction();

    //自定义的槽函数都在这里
    void connectSignalAndSlots();



protected:
    //鼠标拖动窗口
    void mousePressEvent(QMouseEvent *event);
    void mouseMoveEvent(QMouseEvent *event);

private slots:
    void on_quit_clicked();//quit按键被点击槽函数
    void onBtFormClicked(int pageId);//QBForm按键被点击槽函数，pageId是信号发过来的
    void updateLikeMusicAndPage(bool isLike,const QString& musicId);//更新各个页面的歌曲


    void on_volume_clicked();//调节音量按钮

    void on_addLocal_clicked();//添加本地音乐按钮

    void on_play_clicked();//播放按钮

    void onPlayUp();//上一曲按钮
    void onPlayDown();//下一曲按钮

    void onPlayModeClicked();//播放模式按钮

    void onBackModeChange(QMediaPlaylist::PlaybackMode mode);//触发播放模式改变信号

    void onPlayAll(PageType page);//播放所有

    void playAllMusicOfCommonPage(CommonPage* commonPageType,int index);//找到了对应的播放页面后播放相关音乐

    //接受到commonpage中的QListWidget传来的双击信号关联槽
    void playMusicByIndex(CommonPage* commonPageType,int index);

    //playlist中的播放源发生改变播放歌曲改变，index表示正在播放的索引
    void onCurrentIndexChanged(int index);

    //对于来自volumetool的静音信号和槽函数
    void setMusicSilence(bool isMuted);

    //对于来自volumetool的音量调整大小信号和槽函数
    void setPlayerVolume(int volume);


    void onDurationChanged(qint64 duration);// 歌曲持续时长改变时[歌曲切换]
    void onPositionChanged(qint64 position);// 歌曲的播放进度改变时

    // 当进度条改变时
    void onMusicSliderChanged(float ratio);

    //QQMusic类可以给QMediaPlayer发射的 metaDataAvailableChanged(bool) 信号
    //关联槽函数，当歌曲更换时，完成信息的更新。
    void onMetaDataAvailableChangedChanged(bool available);

    //当显示歌词按钮被点击
    void onLrcWordClicked();

    void on_skin_clicked();

    void on_min_clicked();

    void on_max_clicked();

private:
    Ui::QQMusic *ui;
    QPoint dragPosition;
    VolumeTool* volumeTool;
    MusicList musicList;

    //播放控制
    QMediaPlayer* mediaPlayer;
    QMediaPlaylist* mediaPlaylist;

    CommonPage* currentPage;//记录正在播法的歌曲是哪个页面

    qint64 totalTime;

    int currentMusicIndex;//记录当前正在播放的歌曲在媒体列表中的索引

    LrcPage* lrcPage;                //歌词
    QPropertyAnimation* lrcAnimation;//lrc动画

    QSqlDatabase sqlite;

    bool isDrag;//是否允许移动

};
#endif // QQMUSIC_H
